home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
cv_set6
/
cv_set6s.lzh
/
RGB2BMP.S
< prev
next >
Wrap
Text File
|
1997-09-12
|
31KB
|
1,382 lines
*********************************************************************************
* RGB to BMP converter <RGB2BMP.X Ver0.01> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
file_header:
f_type: equ 0 *ファイル識別子 'BM'
f_size: equ 2 *ファイルのサイズ
f_reserved1: equ 6 *予備1
f_reserved2: equ 8 *予備2
f_offbits: equ 10 *ファイル先頭からイメージデータへのオフセット
WIN3_HED:
win3_size: equ 14 *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
win3_width: equ 18 *横サイズ
win3_height: equ 22 *縦サイズ
win3_planes: equ 26 *使用プレーン数
win3_bitcount: equ 28 *色数 (1:2色,4:16色,8:256色,24:16777216色)
win3_comp: equ 30 *圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
win3_size_image equ 34 *イメージデータのサイズ
win3_xpels_pm: equ 38 *X方向のディスプレイ分解能
win3_ypels_pm: equ 42 *Y方向のディスプレイ分解能
win3_clr_used: equ 46 *色変換テーブルの大きさ
win3_clr_imp: equ 50 *重要な色の数
.text
.even
start:
lea.l mysp(pc),sp *スタックセット
lea.l work(pc),a6
lea.l 16(a0),a0 *余分なメモリ開放
suba.l a0,a1
move.l a1,-(sp)
move.l a0,-(sp)
DOS _SETBLOCK
addq.l #8,sp
bsr cmdchk *コマンドラインの解析
bsr s_name_chk *セーブファイル名のチェック
bsr buf_get *バッファ確保
bsr name_get *ファイル名を取得し処理する
bsr buf_free *バッファ開放
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
clr.w file_cnt(a6) *ファイル数のカウント初期化
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg1(a6) *
pea.l filbuf(a6) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
pea.l filbuf(a6) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
bsr file_cnt_chk *処理したファイル数のチェック
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(a6) *ファイル名を展開する
pea.l arg1(a6) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi name_er * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg1(a6),a0 *バッファargに
lea.l nambuf(a6),a1 * nameckで展開したパス名+'*.GLX'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg1(a6) * 検索してみる
pea.l filbuf(a6) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg1(a6),a0 *バッファarg1に
lea.l komekome(pc),a1 * もとのファイル名+'\*.GLX'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* 出力パス名をチェックする *
*****************************************************************
s_name_chk:
lea.l arg2(a6),a0 *出力パス名を指定したか?
tst.b (a0)
beq s_name_chk8 *してない
pea.l nambuf(a6) *ファイル名を展開する
pea.l arg2(a6) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi out_name_err * パス名の指定に誤りがある
beq s_name_chk1 *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne out_name_err * ワイルドカード指定あり
s_name_chk1:
lea.l arg2(a6),a0 *ドライブ名を指定しているか?
cmp.b #':',1(a0)
bne out_name_err *ドライブ名の指定に誤りがある
tst.b 2(a0) *ドライブ名のみか
bne s_name_chk2 *違う
addq.l #2,a0
bra s_name_chk9
s_name_chk2:
moveq.l #0,d0 *セーブ先ドライブ番号を求める
move.b (a0),d0
bsr toupper
sub.b #'A',d0
add.b #1,d0
lea.l spathbuf(a6),a1 *セーブ先ドライブ名
move.b (a0),(a1)+
move.b #':',(a1)+
move.b #'\',(a1)+
move.l a1,-(sp) *セーブ先パスをセーブ
move.w d0,-(sp)
DOS _CURDIR
addq.l #6,sp
lea.l cpathbuf(a6),a2 *カレントパスをセーブしておく
DOS _CURDRV
add.b #"A",d0
move.b d0,(a2)+
move.b #':',(a2)+
move.b #'\',(a2)+
move.l a2,-(sp)
move.w #0,-(sp)
DOS _CURDIR
addq.l #6,sp
pea.l arg2(a6) *コマンドラインで指定されたパスへ
DOS _CHDIR * 移動してみる
addq.l #4,sp
tst.l d0 *d0が0でなければ
bmi out_name_err * パス名の指定に誤りがある
pea.l spathbuf(a6) *セーブ先パスを戻す
DOS _CHDIR
addq.l #4,sp
pea.l cpathbuf(a6) *カレントパスに戻す
DOS _CHDIR
addq.l #4,sp
lea.l arg2(a6),a0 *
bsr set_en *パス名の最後に\マークをセット
bra s_name_chk9
s_name_chk8:
lea.l arg2(a6),a0
s_name_chk9:
move.l a0,nameichi(a6)
rts
*****************************************************************
* パス名に¥マークを連結する *
*****************************************************************
set_en:
tst.b (a0)+ *(a0)は0か?
bne set_en *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
cmp.b #"\",-1(a0) *一番最後の文字が¥か
beq set_en_ * ¥ならばスキップ
move.b #'\',(a0)+ * ¥をセット
set_en_:
rts
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg1以降に格納する *
*****************************************************************
setpath:
lea.l arg1(a6),a0 *a0=コピー先
lea.l nambuf(a6),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(a6),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg1(a6),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #".",(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg1(a6),a0 *a0=引数切り出し領域
clr.b 256(a0) *出力ファイル名をちょっと初期化
addq.l #1,a2 *a2=コマンドライン文字列先頭
sf sflg(a6) *SスイッチOFF
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
lea.l 256(a0),a0 *a0=a0+256
bsr switch_chk *さらにスイッチのチェック
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmpi.b #'S',d0
beq ssw
bra usage
ssw:
tst.b sflg(a6)
bne usage
st sflg(a6)
bra switch_chk
switch_chk2:
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
clr.w line_cnt(a6) *ラインカウント初期化
sf ipr_flg(a6) *IPRあり
bsr ipr_check *IPRファイルのチェック
lea.l arg1(a6),a0 *ファイル名セット
bsr file_open *ファイルオープン
tst.b ipr_flg(a6) *
beq main1
bsr file_size *ファイルサイズからデフォルトサイズをチェック
move.l d6,fi_size(a6)
bsr def_check
main1:
bsr size_set *画像サイズのセット
move.w line_byte1(a6),d0 *メモリチェック
add.w line_byte2(a6),d0
ext.l d0
cmp.l buff_size(a6),d0
bhi main9
bsr convert *コンバート
move.w in_file(a6),-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
addq.w #1,file_cnt(a6)
rts
main9:
move.w in_file(a6),-(sp) *メモリが全然足りない(;_;
DOS _CLOSE
addq.l #2,sp
bra no_buff
*****************************************************************
* IPRファイルの読み込み *
*****************************************************************
ipr_check:
bsr ipr_name_set *IPRファイル名作成
move.w #0,-(sp) *ファイルopen
pea.l arg3(a6)
DOS _OPEN
addq.l #6,sp
tst.l d0
bmi ipr_check1
move.w d0,in_file(a6)
bsr file_size
movea.l buff_addr(a6),a5
bsr file_read
move.w in_file(a6),-(sp)
DOS _CLOSE
addq.l #2,sp
movea.l buff_addr(a6),a0
bsr ipr_check5
move.w d0,yoko(a6)
bsr ipr_check5
move.w d0,tate(a6)
rts
ipr_check1:
st ipr_flg(a6) *IPRなし
rts
ipr_check5:
moveq.l #0,d0
moveq.l #0,d1
ipr_check6:
cmp.b #' ',(a0)+
beq ipr_check6
subq.l #1,a0
ipr_check7:
move.b (a0)+,d1
cmp.b #' ',d1
beq ipr_check8
sub.b #'0',d1
mulu #10,d0
add.w d1,d0
bra ipr_check7
ipr_check8:
subq.l #1,a0
rts
*****************************************************************
* 画像サイズセット *
*****************************************************************
size_set:
move.w yoko(a6),d0 *1ラインのバイト数(読み込み側)
move.w d0,d1
add.w d1,d1
add.w d1,d0
move.w d0,line_byte1(a6)
* move.w yoko(a6),d0 *1ラインのバイト数(書き込み側)
* move.w d0,d1
* add.w d1,d1
* add.w d1,d0
addq.w #3,d0
and.w #$fffc,d0
move.w d0,line_byte2(a6)
rts
*****************************************************************
* デフォルトサイズをチェック *
*****************************************************************
def_check:
lea.l size_table(pc),a0
move.l fi_size(a6),d0
bra def_check1
def_check0:
addq.l #4,a0
def_check1:
move.l (a0)+,d1
beq def_check9 *テーブルになかった
cmp.l d0,d1
bne def_check0
move.w (a0)+,yoko(a6)
move.w (a0)+,tate(a6)
rts
def_check9:
move.w in_file(a6),-(sp)
DOS _CLOSE
addq.l #2,sp
bra ipr_err
*****************************************************************
* コンバート *
*****************************************************************
convert:
bsr prt0
bsr prt1
bsr save_name_set *セーブするファイル名作成
bsr bmphed_set *ヘッダ情報作成
lea.l arg2(a6),a0 *ヘッダ作成
bsr file_create
lea.l head_buff(a6),a5 *ヘッダ書き込み
moveq.l #54,d6
bsr file_write
move.w line_byte1(a6),d0 *一回に変換できるライン数(d3)を求める
add.w line_byte2(a6),d0
move.l buff_size(a6),d3
divu.w d0,d3
cmp.w tate(a6),d3 *一回で変換できるか
bls convert1 *できない
move.w tate(a6),d3
moveq.l #1,d4
moveq.l #0,d5
bra convert2
convert1:
moveq.l #0,d5 *繰り返し数(d4)と残り(d5)を求める
move.w tate(a6),d5
divu.w d3,d5
move.w d5,d4
swap d5
convert2:
move.w line_byte1(a6),d0 *変換先アドレスを求める
mulu.w d3,d0
add.l buff_addr(a6),d0
move.l d0,gr_addr(a6)
bsr convert4
tst.w d5 *半端分があるか
beq convert3 *ない
moveq.l #1,d4
move.w d5,d3
bsr convert4
convert3:
move.w out_file(a6),-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
bsr prt3
rts
convert4:
subq.w #1,d4
convert4_:
bsr seek_get
bsr file_seek
movea.l buff_addr(a6),a5 *読み込み
move.w line_byte1(a6),d6 *YOKO*3*LINE
mulu.w d3,d6
bsr file_read
move.w d3,d7 *コンバート
bsr gr_conv
move.l gr_addr(a6),a5 *書き込み
move.w line_byte2(a6),d6
mulu.w d3,d6
bsr file_write
dbra.w d4,convert4_ *繰り返し
rts
seek_get: *シーク位置(d0)計算
move.w tate(a6),d0
move.w line_cnt(a6),d1
add.w d3,d1
sub.w d1,d0
mulu.w line_byte1(a6),d0
rts
file_seek: *指定位置(d0)にシーク
move.w #0,-(sp)
move.l d0,-(sp)
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0
bmi read_err
rts
*****************************************************************
* 画像変換 *
*****************************************************************
gr_conv:
movem.l d0-d7/a0-a5,-(sp)
subq.w #1,d7 *繰り返し数-1
movea.l buff_addr(a6),a0 *変換元アドレス
move.w d7,d0
mulu.w line_byte1(a6),d0
adda.l d0,a0
movea.l gr_addr(a6),a2 *変換先アドレス
move.w line_byte2(a6),d0 *半端分があるか
sub.w line_byte1(a6),d0
movea.w d0,a5
movea.w line_byte1(a6),a4 *1ライン上への差分
moveq.l #0,d0 *ワーククリア
moveq.l #0,d1
moveq.l #0,d2
move.w #%00000000_00000111,d3 *マスクデータ
tst.b sflg(a6)
beq gr_conv10
gr_conv0:
bsr prt2
movea.l a0,a1
move.w yoko(a6),d6
subq.w #1,d6
gr_conv1:
move.b (a1)+,d0 *R
beq gr_conv2
or.w d3,d0
gr_conv2:
move.b (a1)+,d1 *G
beq gr_conv3
or.w d3,d1
gr_conv3:
move.b (a1)+,d2 *B
beq gr_conv4
or.w d3,d2
gr_conv4:
move.b d2,(a2)+ *BGRの順で書き込む
move.b d1,(a2)+
move.b d0,(a2)+
dbra.w d6,gr_conv1
suba.l a4,a0
move.w a5,d6
beq gr_conv6
subq.w #1,d6
gr_conv5:
clr.b (a2)+
dbra.w d6,gr_conv5
gr_conv6:
dbra.w d7,gr_conv0
movem.l (sp)+,d0-d7/a0-a5
rts
gr_conv10:
bsr prt2
movea.l a0,a1
move.w yoko(a6),d6
subq.w #1,d6
gr_conv11:
move.b (a1)+,d0 *R
move.b (a1)+,d1 *G
move.b (a1)+,d2 *B
move.b d2,(a2)+ *B
move.b d1,(a2)+ *G
move.b d0,(a2)+ *R
dbra.w d6,gr_conv11
suba.l a4,a0
move.w a5,d6
beq gr_conv13
subq.w #1,d6
gr_conv12:
clr.b (a2)+
dbra.w d6,gr_conv12
gr_conv13:
dbra.w d7,gr_conv10
movem.l (sp)+,d0-d7/a0-a5
rts
*****************************************************************
* BMPヘッダの作成 *
*****************************************************************
bmphed_set:
lea.l head_buff(a6),a1 *バッファの先頭
move.w #'BM',f_type(a1) *ファイル識別子
move.w tate(a6),d0 *ファイルサイズ(TATExlinebyte+54)
mulu.w line_byte2(a6),d0
move.l d0,d1
add.l #54,d0
bsr i_to_m
move.l d0,f_size(a1)
clr.w f_reserved1(a1) *予備1
clr.w f_reserved2(a1) *予備2
move.l #$36000000,f_offbits(a1) *ファイル先頭からイメージデータへのオフセット
move.l #$28000000,win3_size(a1) *ヘッダサイズ(12:OS/2 V1, 40:Win3, 64:OS/2 V2)
move.w yoko(a6),d0 *横サイズ
ext.l d0
bsr i_to_m
move.l d0,win3_width(a1)
move.w tate(a6),d0 *縦サイズ
ext.l d0
bsr i_to_m
move.l d0,win3_height(a1)
move.w #$0100,win3_planes(a1) *使用プレーン数
move.w #$1800,win3_bitcount(a1) *使用bit数(1:2色,4:16色,8:256色,24:16777216色)
move.l #0,win3_comp(a1) *圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
move.l d1,d0 *イメージデータのサイズ
bsr i_to_m
move.l d0,win3_size_image(a1)
* clr.l win3_xpels_pm(a1) *X方向のディスプレイ分解能
* clr.l win3_ypels_pm(a1) *Y方向のディスプレイ分解能
move.l #$130B0000,win3_xpels_pm(a1) *X方向のディスプレイ分解能
move.l #$130B0000,win3_ypels_pm(a1) *Y方向のディスプレイ分解能
clr.l win3_clr_used(a1) *色変換テーブルの大きさ
clr.l win3_clr_imp(a1) *重要な色の数
rts
i_to_m:
ror.w #8,d0
swap.w d0
ror.w #8,d0
rts
*****************************************************************
* IPR名の作成 *
*****************************************************************
ipr_name_set:
lea.l arg1(a6),a1 *転送元
lea.l arg3(a6),a0 *転送先
bsr strcpy *ファイル名を複写する
lea.l arg3(a6),a0 *拡張子を'IPR'に変更
lea.l cext1(pc),a1
bsr cheng_ext
rts
*****************************************************************
* セーブ名の作成 *
*****************************************************************
save_name_set:
lea.l filbuf(a6),a1 *転送元
lea.l 30(a1),a1
movea.l nameichi(a6),a0 *転送先
bsr strcpy *ファイル名を複写する
lea.l arg2(a6),a0 *拡張子を'BMP'に変更
lea.l cext2(pc),a1
bsr cheng_ext
rts
*****************************************************************
* 拡張子を変更する *
*****************************************************************
cheng_ext:
* lea.l arg2(a6),a0 *ファイル名のアドレス
* lea.l cext1(pc),a1
cheng_ext0:
cmp.b #".",(a0)+ *拡張子があるか
bne cheng_ext0
subq.l #1,a0 *行きすぎたから1つ戻る
cheng_ext1:
move.b (a1)+,(a0)+ *1文字転送
bne cheng_ext1 *終了コードまで繰り返す
cheng_ext2:
rts
*****************************************************************
* 表示関係 *
*****************************************************************
prt0: *表示バッファ初期化
movem.l d0/a0,-(sp)
lea.l prt_buff(a6),a0
moveq.l #96-1,d0
prt0_:
move.b #SPACE,(a0)+
dbra.w d0,prt0_
clr.b (a0)+
movem.l (sp)+,d0/a0
rts
prt1: *ファイル名とサイズ表示
movem.l d0/a0-a1,-(sp)
lea.l prt_buff(a6),a0
lea.l filbuf(a6),a1
lea.l 30(a1),a1
bsr strcpy
move.b #SPACE,(a0)
lea.l prt_buff(a6),a0 *位置合わせ
adda.l #22,a0
move.b #"(",(a0)+
move.w yoko(a6),d0
bsr dec_set
move.b #",",(a0)+
move.w tate(a6),d0
bsr dec_set
move.b #")",(a0)+
lea.l crlf_mes(pc),a1
bsr strcpy
lea.l prt_buff(a6),a0
bsr mesput
movem.l (sp)+,d0/a0-a1
rts
prt2: *変換ライン数表示
movem.l d0-d1/a0-a1,-(sp)
lea.l prt_buff(a6),a0
addq.w #1,line_cnt(a6)
move.w line_cnt(a6),d0
bsr dec_set
move.b #"/",(a0)+
move.w tate(a6),d0
bsr dec_set
lea.l henkan_mes(pc),a1
bsr strcpy
lea.l crlf_mes(pc),a1
bsr strcpy
IOCS _B_UP_S
moveq.l #40,d1
IOCS _B_RIGHT
lea.l prt_buff(a6),a0
bsr mesput
movem.l (sp)+,d0-d1/a0-a1
rts
prt3: *'終了!'表示
movem.l d0-d1/a0-a1,-(sp)
lea.l prt_buff(a6),a0
lea.l syuryo_mes(pc),a1
bsr strcpy
lea.l crlf_mes(pc),a1
bsr strcpy
IOCS _B_UP_S
moveq.l #49,d1
IOCS _B_RIGHT
lea.l prt_buff(a6),a0
bsr mesput
movem.l (sp)+,d0-d1/a0-a1
rts
dec_set
move.l a0,-(sp)
ext.l d0
lea.l dec_buf(a6),a0
bsr bin2dec
bsr zero_keshi
move.l (sp)+,a0
lea.l dec_buf(a6),a1
addq.l #6,a1
bsr strcpy
rts
*****************************************************************
* 2進=>10進 *
* d0 変換元の数値 a0 変換後の格納アドレス *
*****************************************************************
bin2dec:
movem.l d0-d3/a0-a1,-(sp)
moveq.l #10-1,d1
lea.l exp_tbl(pc),a1
bin2dec0:
clr.b d2
move.l (a1)+,d3
bin2dec1:
or d3,d3
sub.l d3,d0
bcs bin2dec2
addq.b #1,d2
bra bin2dec1
bin2dec2:
add.l d3,d0
add.b #'0',d2
move.b d2,(a0)+
dbra d1,bin2dec0
movem.l (sp)+,d0-d3/a0-a1
rts
exp_tbl:
.dc.l 1000000000
.dc.l 100000000
.dc.l 10000000
.dc.l 1000000
.dc.l 100000
.dc.l 10000
.dc.l 1000
.dc.l 100
.dc.l 10
.dc.l 1
*****************************************************************
* ファイルサイズの頭にある'0'を消す *
*****************************************************************
zero_keshi:
lea.l dec_buf(a6),a0
moveq.l #9-1,d0
zero_keshi0:
cmp.b #'0',(a0)
bne zero_keshi9
move.b #SPACE,(a0)+
dbra.w d0,zero_keshi0
zero_keshi9:
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0
bmi open_err
move.w d0,in_file(a6)
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w in_file(a6),-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a5,-(sp) *バッファアドレス
move.w in_file(a6),-(sp)
DOS _READ
lea 10(sp),sp
tst.l d0
bmi read_err
cmp.l d6,d0
bne read_err
rts
*****************************************************************
* ファイル作成 *
*****************************************************************
file_create:
move.w #$20,-(sp) *ファイルCREATE
move.l a0,-(sp)
DOS _CREATE
addq.l #6,sp
tst.l d0
bmi create_err
move.w d0,out_file(a6)
rts
*****************************************************************
* ディスクに書き込む *
*****************************************************************
file_write:
move.l d6,-(sp) *データサイズ
move.l a5,-(sp) *バッファアドレス
move.w out_file(a6),-(sp)
DOS _WRITE
lea.l 10(sp),sp
tst.l d0
bmi write_err
cmp.l d6,d0
bne write_err
rts
*****************************************************************
* バッファ確保 *
*****************************************************************
buf_get:
pea.l -1.w *確保出来る最大サイズを取得
DOS _MALLOC
addq.l #4,sp
andi.l #$00ffffff,d0
move.l d0,d1
move.l d0,-(sp)
DOS _MALLOC
addq.l #4,sp
tst.l d0
bmi no_buff
move.l d0,buff_addr(a6) *バッファアドレス
move.l d1,buff_size(a6) *バッファサイズ
rts
*****************************************************************
* バッファ開放 *
*****************************************************************
buf_free:
pea.l buff_addr(a6) *バッファ開放
DOS _MFREE
addq.l #4,sp
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
tst.w file_cnt(a6) *処理したファイルは0個か
bne file_cnt_chk1 *違う
lea.l no_file_mes(pc),a0
bsr mesput
file_cnt_chk1:
rts
*****************************************************************
* ファイル名エラー *
*****************************************************************
name_er:
lea.l in_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルエラー *
*****************************************************************
file_er:
move.w in_file(pc),-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
lea.l arg1(a6),a0
bsr mesput
lea.l file_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メモリが足りない *
*****************************************************************
no_buff:
lea.l arg1(a6),a0
bsr mesput
lea.l no_buff_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg1(a6),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg1(a6),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 出力パス名エラー *
*****************************************************************
out_name_err:
lea.l out_mes(pc),a0
bsr mesput
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル作成エラー *
*****************************************************************
create_err:
lea.l arg2(a6),a0
bsr mesput
lea.l create_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル作成エラー *
*****************************************************************
ipr_err:
lea.l ipr_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイル書き込みエラー *
*****************************************************************
write_err:
lea.l arg2(a6),a0
bsr mesput
lea.l write_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
IOCS _MS_INIT *キーバッファクリア
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w #-1,-(sp)
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b 'RGB to BMP converter V0.01 by A.MUKAWA',CR,LF
.dc.b '機能:24bitベタのRGBファイルを フルカラーBMPファイルにコンバートします',CR,LF
.dc.b '用法:RGB2BMP [スイッチ] ファイル名 [セーブ先パス]',CR,LF
.dc.b CR,LF
.dc.b ' /M マチエールフィルタ(謎)をかける',CR,LF
.dc.b 0
in_mes:
.dc.b '入力ファイル',0
out_mes:
.dc.b '出力先パス',0
name_er_mes:
.dc.b '名の指定に間違いがあります!',CR,LF,0
file_er_mes:
.dc.b ' はファイルが壊れているか、RGBファイルではないようです!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
ipr_er_mes:
.dc.b 'IPRファイルがありません!',CR,LF,0
no_buff_mes:
.dc.b ' の変換に必要なメモリがありません!',CR,LF,0
create_er_mes:
.dc.b ' が作れません!',CR,LF,0
write_er_mes:
.dc.b ' の書き込みエラーが発生しました!',CR,LF,0
no_file_mes:
.dc.b '変換できるファイルがありませんでした!',CR,LF,0
henkan_mes:
.dc.b ' 変換中',0
syuryo_mes:
.dc.b ' 終了!',0
crlf_mes:
.dc.b CR,LF,0
func_off_mes:
.dc.b $1b,$5b,$3e,$31,$68,0
sla_mes:
.dc.b '/',0
dext:
.dc.b '.RGB',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.RGB',0
cext1:
.dc.b '.IPR',0 *変更する拡張子1
cext2:
.dc.b '.BMP',0 *変更する拡張子2
.even
size_table:
.dc.l 49152 *S128_128:
.dc.w 128,128
.dc.l 196608 *S256_256:
.dc.w 256,256
.dc.l 345600 *S480_240:
.dc.w 480,240
.dc.l 691200 *S480_480:
.dc.w 480,480
.dc.l 786432 *S512_512:
.dc.w 512,512
.dc.l 768000 *S640_400:
.dc.w 640,400
.dc.l 921600 *S640_480:
.dc.w 640,480
.dc.l 1179648 *S768_512:
.dc.w 768,512
.dc.l 1228800 *S640_640:
.dc.w 640,640
.dc.l 2359296 *S1024_768:
.dc.w 1024,768
.dc.l 3145728 *S1024_1024:
.dc.w 1024,1024
.dc.l 3072000 *S1280_800:
.dc.w 1280,800
.dc.l 3686400 *S1280_960:
.dc.w 1280,960
.dc.l 3932160 *S1280_1024:
.dc.w 1280,1024
.dc.l 0 *S_OTHER:
.dc.w 0,0
*****************************************************************
* ワークエリア *
*****************************************************************
.offset 0
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg1:
.ds.b 256 *入力ファイル名バッファ
arg2:
.ds.b 256 *出力ファイル名バッファ
arg3:
.ds.b 256 *IPRファイル名バッファ
cpathbuf
.ds.b 65 *カレントパス名バッファ
spathbuf
.ds.b 65 *セーブ先パス名バッファ
.even
head_buff:
.ds.b 54 *BMPヘッダバッファ
buff_addr:
.ds.l 1 *画像読み込みバッファアドレス
buff_size:
.ds.l 1 *画像読み込みバッファサイズ
gr_addr:
.ds.l 1 *画像データアドレス
fi_size:
.ds.l 1 *ファイルサイズ
yoko:
.ds.w 1 *画像の横(X)サイズ
tate:
.ds.w 1 *画像の縦(Y)サイズ
line_byte1:
.ds.w 1 *1ラインのバイト数(読み込み側)
line_byte2:
.ds.w 1 *1ラインのバイト数(書き込み側)
line_cnt:
.ds.w 1
file_cnt:
.ds.w 1
nameichi:
.ds.l 1
in_file:
.ds.w 1
out_file:
.ds.w 1
dec_buf:
.ds.b 10+1
prt_buff:
.ds.b 96+1
sflg:
.ds.b 1
ipr_flg:
.ds.b 1
.even
WORK_SIZE:
.bss
.even
work:
.ds.b WORK_SIZE
my_stack:
.ds.l 1024
mysp:
.end start